\chapter*{Собственное всё}
  

 Рассказывая о работе студии Digital Domain над
    фильмом “I, Robot”, мы вскользь упомянули тот факт, что в различные
    слои рендерятся не только различные части робота, но и различные
    части шейдера, в частности diffuse-проход. Как это делается?
    Рассмотрим на примере стандартного шейдера plastic:
  

surface plastic( float Ks=.5, Kd=.5, Ka=1,
  

                  roughness=.1;
    color specularcolor=1 )
  

{
  

     normal Nf;
  

     vector V;
  

     Nf = faceforward( normalize(N), I
    );
  

     V = -normalize(I);
  

     Oi = Os;
  

     Ci = Os * ( Cs * (Ka*ambient() +
    Kd*diffuse(Nf)) +
  

             specularcolor *
    Ks * specular(Nf,V,roughness) );
  

 }
  

 Как видно из заголовка шейдера, никакие переменные
    из него вывести в виде отдельного слоя не получится; для этого
    придётся заниматься модификацией кода. Чтобы получить diffuse в
    виде отдельного слоя, шейдер нужно изменить, например, вот таким
    образом:
  

surface
    plastic( float Ks=.5, Kd=.5, Ka=1,
  

                  roughness=.1; color specularcolor=1;
  

                  output color diffuseC = 0; )
  

{
  

     normal Nf;
  

     vector V;
  

     Nf = faceforward( normalize(N), I
    );
  

     V = -normalize(I);
  

     diffuseC = Kd*diffuse(Nf);
  

     Oi = Os;
  

     Ci = Os * ( Cs * (Ka*ambient() +
    diffuseC) +
  

             specularcolor *
    Ks * specular(Nf,V,roughness) );
  

 }
  

 Как видите, для решения даже простой задачи,
    которую поставили перед нами требования реального продакшна,
    потребовалось пусть небольшое, но изменение стандартного шейдера.
    Отсюда и последует наш совет.
  

 Ничто не даёт бОльшего чуства контроля над
    ситуацией, как собственноручно сделанный, отобранный и настроенный
    инструментарий. В особенности это касается шейдеров, и в ещё
    большей особенности – тех самых шейдеров, которые идут в
    стандартной поставке любого Renderman-совместимого
    рендерера.
  

 Эти шейдеры хороши, подробно описаны, по ним хорошо
    учиться – но потом наступает момент, когда вы хотите чего-то
    нового, существующие возможности вас не устраивают – это означает,
    что пора начинать писать своё.
  

 Так вот совет наш будет таким – не используйте
    стандартные шейдеры. С ними сложно рендерить по слоям, с ними
    сложно настраивать освещение, экпериментировать с многослойными
    текстурами. Напишите свои шейдеры, хорошенько их проверьте в бою,
    прооптимизируйте и настройте под себя – и всегда и везде
    пользуйтесь ними.
  \chapter*{Для
    любознательных – пример из жизни}
  

 Вы думаете, что всё, выше написанное – трудно,
    тяжело и малоприменимо? Вот вам реальный пример из реального
    проекта со слов человека, его делавшего, и пересказаный моими
    собственными словами.
  

 Итак, в наличии имеется сцена с внутренностями
    огромного здания. Изначальная диспозиция такова: здание
    смоделировано полигонами в количестве сколько-то там миллионов
    штук, при этом постоянно обновляется и достраивается. Генерация
    RIBа занимает порядка десяти минут. Здание буквально купается в
    ярком солнечном свете; решётчатая облицовка, колонны и
    перекрытия-галерей отбрасывают чёткие тени на пол и стены. Всё
    остальное освещение в сцене – отражённый и рассеянный свет от стен
    и предметов. Посреди холла установлена огромная отполированная
    статуя робота.
  

 Налицо патовая ситуация – явное проявление болезни
    под названием “нужна radiocity” с осложнениями в виде невозможно
    детализированной модели.
  

 Первым делом в руки берётся топор и из сцены к
    такой-то бабушке удаляется всё, что не будет видно камере в
    конкретном кадре. Имена всех удалённых объектов аккуратно
    записываются в отдельный файлик; таким образом нам будет легче
    убирать их в следующий раз, когда гигантскую модель здания в
    очередной раз обновят.
  

 Далее сцена анализируется и разбивается на части. В
    качестве критерия разбивки используется материал, из которого
    изготовлен предмет – пластик, бетон, стекло, металл, мрамор и так
    далее. Каждая часть экспортируется в RIB, удаляется из сцены и
    заново подключается в сцену с использованием RIBbox’ов – которые
    вешаются на простые кубики и шарики. На этом этапе к сцене
    вернулась возможность поворачиваться во вьюпорте без натужного
    скрипа жёстким диском.
  

 На этом этапа начинается работа над освещением.
    Изначально планировалось использовать новые возможности Renderman
    Pro Server – “запечь” отражённый свет в специальный кэш (irradiance
    cache file), который бы затем использовался в шейдерах – но
    оказалось, что для моделей такой сложности работать с кэшем просто
    невозможно – его размер быстро превышает все разумные рамки, и
    пропорционально падает скорость доступа к нему. Кроме того любое
    изменение модели потребовало бы по крайней мере частичного
    пересчета кэша; изменения, которые потенциально могли внести
    режиссер или супервайзор проекта также потребовали бы длительной и
    трудоемкой перенастройки параметров global illumination и опять
    таки пересчета кэша.
  

 Пришлось хитрить. Один раз для сцены было
    просчитано решение ambient occlusion и записано в виде отдельного
    слоя. Этот слой затем аккуратно подмешивался в источники света – а
    было их в этой сцене не так уж и много, не больше десяти
    spotlight’ов с разными яркостями, направлениями и
    цветом.
  

 Кроме этих спотов, в сцену добавили один источник
    света с тенью, генерируемой при помощи raytrace – к сожалению, без
    него не обошлось; использовались с десяток локальных источников,
    которыми подмазывали, подкрашивали и подсвечивали.
  

 Cначала рендерился основной проход – в нём всё
    стекло выключили. В расчёте ambient occlusion его тоже не было
    видно для камеры – но occlusion-лучи, выстреливаемые из каждой
    точки сцены, стекло видели и таким образом добавили необходимые
    детали в освещение этажей.
  

 И наконец, отдельно считалось стекло.Кроме
    основного слоя, для каждой стекляшки также считались нормали
    поверхности – потом, на этапе сборки сцены из кусков в композере,
    при помощи этих нормалей на гранях между стёклами (то есть в точке
    разрыва и резкого изменения нормалей) усиливались блики.
  

 Абсолютно естественно, что все роботы и люди,
    которых вы видели в кадре – тоже считались отдельно и приклеивались
    уже на композе.
  

 Как видите, все те советы и трики, о которых мы с
    вами поговорили, более чем реальны и применяются в реальном кино- и
    видео-производстве – данный пример с говорит сам за себя. Нам
    остаётся дать последний в нашей главе – и самый главный
    совет.
